import ast
import logging
from 程序核心代码.mvvm重构.基础定义.基础图形项.节点图形项.带组件带布局的节点图形项 import 带组件带布局的节点图形项
from 程序核心代码.mvvm重构.基础定义.基础模型.ast节点模型基类 import ast节点基础模型
from 程序核心代码.mvvm重构.基础定义.节点管理器.自动节点注册表 import 注册节点模型, 节点模型匹配器, 注册节点图形项

logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

@注册节点模型(ast.ClassDef, lambda node: len(node.decorator_list) > 0)
class 带装饰器类节点模型(ast节点基础模型):
    """
    带装饰器的类定义节点模型
    例如：
    @dataclass
    class MyClass:
        pass
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, "带装饰器类定义", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 创建类定义输出接口
        self.添加接口到节点("数据流", "输出", 接口名称="类定义", 必须连接=True)

        # 处理装饰器列表
        for 索引, 装饰器 in enumerate(self._ast节点.decorator_list):
            装饰器节点 = 节点模型匹配器(装饰器, self.所属节点模型管理器)
            if 装饰器节点:
                起始接口 = 装饰器节点.添加接口到节点("数据流", "输出", 接口名称="装饰器", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"装饰器_{索引}", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

        # 处理类体
        for 索引, 语句 in enumerate(self._ast节点.body):
            语句节点 = 节点模型匹配器(语句, self.所属节点模型管理器)
            if 语句节点:
                起始接口 = 语句节点.添加接口到节点("数据流", "输出", 接口名称="语句", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"类体_{索引}", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

@注册节点图形项(ast.ClassDef, lambda node: len(node.decorator_list) > 0)
class 带装饰器类图形节点(带组件带布局的节点图形项):
    """
    带装饰器的类定义的图形表示
    """
    def __init__(self, 节点模型, 父容器节点图形项管理器, 父项=None):
        super().__init__(节点模型, 父容器节点图形项管理器, 父项)

@注册节点模型(ast.FunctionDef, lambda node: len(node.decorator_list) > 0)
class 带装饰器函数节点模型(ast节点基础模型):
    """
    带装饰器的函数定义节点模型
    例如：
    @staticmethod
    def my_function():
        pass
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, "带装饰器函数定义", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 创建函数定义输出接口
        self.添加接口到节点("数据流", "输出", 接口名称="函数定义", 必须连接=True)

        # 处理装饰器列表
        for 索引, 装饰器 in enumerate(self._ast节点.decorator_list):
            装饰器节点 = 节点模型匹配器(装饰器, self.所属节点模型管理器)
            if 装饰器节点:
                起始接口 = 装饰器节点.添加接口到节点("数据流", "输出", 接口名称="装饰器", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"装饰器_{索引}", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

        # 处理参数
        参数节点 = 节点模型匹配器(self._ast节点.args, self.所属节点模型管理器)
        if 参数节点:
            起始接口 = 参数节点.添加接口到节点("数据流", "输出", 接口名称="参数列表", 必须连接=True)
            结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="参数", 必须连接=True)
            起始接口.接口创建连接线模型(结束接口, self)

        # 处理函数体
        for 索引, 语句 in enumerate(self._ast节点.body):
            语句节点 = 节点模型匹配器(语句, self.所属节点模型管理器)
            if 语句节点:
                起始接口 = 语句节点.添加接口到节点("数据流", "输出", 接口名称="语句", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"函数体_{索引}", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

        # 处理返回注解
        if self._ast节点.returns:
            返回注解节点 = 节点模型匹配器(self._ast节点.returns, self.所属节点模型管理器)
            if 返回注解节点:
                起始接口 = 返回注解节点.添加接口到节点("数据流", "输出", 接口名称="类型", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="返回类型", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

@注册节点图形项(ast.FunctionDef, lambda node: len(node.decorator_list) > 0)
class 带装饰器函数图形节点(带组件带布局的节点图形项):
    """
    带装饰器的函数定义的图形表示
    """
    def __init__(self, 节点模型, 父容器节点图形项管理器, 父项=None):
        super().__init__(节点模型, 父容器节点图形项管理器, 父项)

@注册节点模型(ast.AsyncFunctionDef, lambda node: len(node.decorator_list) > 0)
class 带装饰器异步函数节点模型(ast节点基础模型):
    """
    带装饰器的异步函数定义节点模型
    例如：
    @asynccontextmanager
    async def my_async_function():
        pass
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, "带装饰器异步函数定义", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 创建异步函数定义输出接口
        self.添加接口到节点("数据流", "输出", 接口名称="异步函数定义", 必须连接=True)

        # 处理装饰器列表
        for 索引, 装饰器 in enumerate(self._ast节点.decorator_list):
            装饰器节点 = 节点模型匹配器(装饰器, self.所属节点模型管理器)
            if 装饰器节点:
                起始接口 = 装饰器节点.添加接口到节点("数据流", "输出", 接口名称="装饰器", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"装饰器_{索引}", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

        # 处理参数
        参数节点 = 节点模型匹配器(self._ast节点.args, self.所属节点模型管理器)
        if 参数节点:
            起始接口 = 参数节点.添加接口到节点("数据流", "输出", 接口名称="参数列表", 必须连接=True)
            结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="参数", 必须连接=True)
            起始接口.接口创建连接线模型(结束接口, self)

        # 处理函数体
        for 索引, 语句 in enumerate(self._ast节点.body):
            语句节点 = 节点模型匹配器(语句, self.所属节点模型管理器)
            if 语句节点:
                起始接口 = 语句节点.添加接口到节点("数据流", "输出", 接口名称="语句", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"函数体_{索引}", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

        # 处理返回注解
        if self._ast节点.returns:
            返回注解节点 = 节点模型匹配器(self._ast节点.returns, self.所属节点模型管理器)
            if 返回注解节点:
                起始接口 = 返回注解节点.添加接口到节点("数据流", "输出", 接口名称="类型", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="返回类型", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

@注册节点图形项(ast.AsyncFunctionDef, lambda node: len(node.decorator_list) > 0)
class 带装饰器异步函数图形节点(带组件带布局的节点图形项):
    """
    带装饰器的异步函数定义的图形表示
    """
    def __init__(self, 节点模型, 父容器节点图形项管理器, 父项=None):
        super().__init__(节点模型, 父容器节点图形项管理器, 父项)